package com.cheer.ba.widget.myrecycleview;

import android.support.v7.widget.RecyclerView;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

/**
 * 基础的adapter
 *
 * @author HQ
 *         created at 2017/3/30 0030 16:32
 */
public abstract class BaseAdapter<M, H extends BaseHolder<M>> extends RecyclerView.Adapter<H> {

    protected List<M> dataList;
    protected OnItemClickListener<M, H> listener;

    public interface OnItemClickListener<M, H extends BaseHolder<M>> {
        void onItemClick(H holder, M data);
    }

    /**
     * 无参数构造方法,数据调用{@link BaseAdapter#fillList(List)}填充
     */
    public BaseAdapter() {
        dataList = new ArrayList<>();
    }

    /**
     * 设置一个Item点击回调接口,数据后续调用{@link BaseAdapter#fillList(List)}填充
     *
     * @param listener 回调接口
     */
    public BaseAdapter(OnItemClickListener<M, H> listener) {
        dataList = new ArrayList<>();
        this.listener = listener;
    }

    /**
     * 设置数据，并设置点击回调接口
     *
     * @param list     数据集合
     * @param listener 回调接口
     */
    public BaseAdapter(List<M> list, OnItemClickListener<M, H> listener) {
        this.dataList = list;
        if (this.dataList == null) {
            this.dataList = new ArrayList<M>();
        }
        if (null != listener){
            this.listener = listener;
        }
    }

    @Override
    public void onBindViewHolder(final H holder, final int position) {
        if (getItemCount() > 0) {
            holder.getCount(getItemCount());
            holder.setData(getItem(position));
            if (listener != null) {
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        listener.onItemClick(holder, getItem(position));
                    }
                });
            }
        }
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    /**
     * 获取一条数据
     *
     * @param holder item对应的holder
     * @return 该item对应的数据
     */
    public M getItem(H holder) {
        return dataList.get(holder.getLayoutPosition());
    }

    /**
     * 获取一条数据
     *
     * @param position item的位置
     * @return item对应的数据
     */
    public M getItem(int position) {
        return dataList.get(position);
    }

    /**
     * 获取该条目的下标
     *
     * @param data
     * @return
     */
    public int getPosition(M data) {
        return dataList.indexOf(data);
    }

    /**
     * 填充数据，此方法会情清空以前的数据
     *
     * @param list 需要显示的数据
     */
    public void fillList(List<M> list) {
        dataList.clear();
        dataList.addAll(list);
        notifyDataSetChanged();
    }

    /**
     * 更新数据
     *
     * @param list
     * @param isNotifyDataChanged 是否刷新界面
     */
    public void fillList(List<M> list, boolean isNotifyDataChanged) {
        dataList.clear();
        dataList.addAll(list);
        if (isNotifyDataChanged) {
            notifyDataSetChanged();
        }
    }

    /**
     * 追加一条数据
     *
     * @param data 追加的数据
     */
    public void appendItem(M data) {
        dataList.add(data);
        notifyDataSetChanged();
    }

    /**
     * 追加一条数据
     *
     * @param data                追加的数据
     * @param isNotifyDataChanged 是否刷新界面
     */
    public void appendItem(M data, boolean isNotifyDataChanged) {
        dataList.add(data);
        if (isNotifyDataChanged) {
            notifyDataSetChanged();
        }
    }

    /**
     * 追加一个集合数据
     *
     * @param list 要追加的数据集合
     */
    public void appendList(List<M> list) {
        dataList.addAll(list);
        notifyDataSetChanged();
    }

    /**
     * 添加一个集合数据
     *
     * @param list                要追加的数据集合
     * @param isNotifyDataChanged 是否刷新界面
     */
    public void appendList(List<M> list, boolean isNotifyDataChanged) {
        dataList.addAll(list);
        if (isNotifyDataChanged) {
            notifyDataSetChanged();
        }
    }

    /**
     * 插入一条数据
     *
     * @param data
     * @return
     */
    public boolean update(M data) {
        int index = getPosition(data);
        if (index > -1) {
            dataList.set(index, data);
            notifyDataSetChanged();
        }
        return index != -1;
    }

    /**
     * 插入一条数据
     *
     * @param data
     * @return
     */
    public boolean update(M data, boolean isNotifyDataChanged) {
        int index = getPosition(data);
        if (index > -1) {
            dataList.set(index, data);
            if (isNotifyDataChanged) {
                notifyDataSetChanged();
            }
        }
        return index != -1;
    }

    /**
     * 插入一条数据,并刷新界面
     *
     * @param holder item对应的holder
     * @param data   item的数据
     */
    private void updateItem(H holder, M data) {
        dataList.set(holder.getLayoutPosition(), data);
        notifyDataSetChanged();
    }


    /**
     * 在头部加入数据
     *
     * @param data 要前置的数据
     */
    public void preposeItem(M data) {
        dataList.add(0, data);
        notifyDataSetChanged();
    }

    /**
     * 在头部加入数据集合
     *
     * @param list 要前置的数据集合
     */
    public void preposeList(List<M> list) {
        dataList.addAll(0, list);
        notifyDataSetChanged();
    }
}
